/**
 * @typedef {Object} AntdFile 通过antd组件上传的文件
 * @property {boolean} [isOldData] 是否老数据
 * @property {string} [uid] 文件上传唯一id
 * @property {string} [name] 文件名
 * @property {string} [thumbUrl] 缩略图地址也是文件地址
 * @property {'uploading' | 'error' | 'down'} [status] 状态
 * @property {Object} [response] 后端返回信息
 * @property {number} [response.code] 后端返回码
 * @property {AekFile} [response.data] 后端返回数据
 */

import { isEmpty } from 'lodash-es'
import { nanoid } from 'nanoid'

/**
 * @typedef {Object} AekFile 后端返回的文件
 * @property {string} [id] 文件id
 * @property {string} [fileNo] 文件fileNo
 * @property {string} [fileName] 文件名
 * @property {string} [fileType] 文件后缀
 */

/**
 * 获取文件的id
 * @param {Object} param0
 * @param {AntdFile} param0.antdFile
 * @param {AekFile} param0.aekFile
 * @returns
 */
export const getFileId = ({ antdFile, aekFile }) => {
  return antdFile?.response?.data?.id || aekFile?.id
}

/**
 * 获取文件的fileNo
 * @param {Object} param0
 * @param {AntdFile} param0.antdFile
 * @param {AekFile} param0.aekFile
 * @returns
 */
export const getFileNo = ({ antdFile, aekFile }) => {
  return antdFile?.response?.data?.fileNo || aekFile?.fileNo
}

/**
 * 获取文件的类型
 * @param {Object} param0
 * @param {AntdFile} param0.antdFile
 * @param {AekFile} param0.aekFile
 * @returns
 */
export const getFileType = ({ antdFile, aekFile }) => {
  return antdFile?.response?.data?.fileType || aekFile?.fileType
}

/**
 * 获取文件地址
 * @param {Object} param0
 * @param {AntdFile} param0.antdFile
 * @param {AekFile} param0.aekFile
 * @param {string} param0.fileId 文件的id
 * @param {string} param0.fileNo 文件的fileNo
 * @returns
 */
export const getFileUrl = ({ antdFile, aekFile, fileId, fileNo }) => {
  // 如果是老数据，直接返回地址
  if (antdFile?.isOldData) {
    return antdFile.thumbUrl
  }
  let relFileId = fileId
  let relFileNo = fileNo
  if (antdFile) {
    relFileId = getFileId({ antdFile })
    relFileNo = getFileNo({ antdFile })
  }
  if (aekFile) {
    relFileId = getFileId({ aekFile })
    relFileNo = getFileNo({ aekFile })
  }
  if (!relFileId && !relFileNo) {
    throw new Error('未找到fileId和fileNo')
  }
  if (relFileId) {
    return `/unify-platform/systemFile/downloadFile?fileId=${relFileId}`
  }
  if (relFileNo) {
    return `/unify-platform/systemFile/downloadFile?fileNo=${relFileNo}`
  }
}

/**
 * 处理文件格式
 * @param {AekFile} file
 * @returns
 */
export const transToAntdFile = file => {
  // 如果是字符串
  if (typeof file === 'string') {
    const lastSplitIndex = file.lastIndexOf('/')
    const fileName = file.substring(lastSplitIndex + 1)
    return {
      isOldData: true,
      uid: nanoid(),
      status: 'done',
      name: fileName,
      thumbUrl: file,
      response: {
        code: 0,
        data: {
          fileName,
          fileType: fileName.split('.')[1],
        },
      },
    }
  }
  // 如果存在uid，说明文件已经是antd的file格式，直接返回
  if (file.uid) return file
  return {
    uid: nanoid(),
    status: 'done',
    name: file.fileName,
    thumbUrl: getFileUrl({ fileId: file.id }),
    response: {
      code: 0,
      data: {
        id: file.id,
        fileName: file.fileName,
        fileNo: file.fileNo,
        fileType: file.fileType,
      },
    },
  }
}

/**
 * 将服务器回传的文件列表转化为antd的upload支持的fileList
 * @param list
 * @returns {Array<AekFile>}
 */
export const transToAntdFileList = list => {
  if (isEmpty(list)) return []
  let newList = list
  // 如果是字符串，说明是老数据，做兼容处理
  if (typeof list === 'string') {
    newList = list.split(',')
  }
  return newList.map(file => transToAntdFile(file)).filter(item => !!item)
}
